package com.uleth.mbank.aes;

import org.bouncycastle.crypto.BufferedBlockCipher;  
import org.bouncycastle.crypto.engines.AESFastEngine;  
import org.bouncycastle.crypto.modes.CBCBlockCipher;  
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;  
import org.bouncycastle.crypto.params.KeyParameter;  
import org.bouncycastle.crypto.params.ParametersWithIV;  
import org.bouncycastle.util.encoders.Hex;  
  
/** 
 * @author Albert 
 * @version 1.0 
 * 
 */  
public class AESWithoutJCE {  
  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        byte[] keybytes = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,  
                0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38 };  
        byte[] iv = { 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x38,  
                0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31 };  
        
        
        String content ="TEST1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";  
        System.out.println("Original content:");  
        System.out.println(content);  
        
        try {  
            BufferedBlockCipher engine = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESFastEngine()));  
            engine.init(true, new ParametersWithIV(new KeyParameter(keybytes),iv));  
            byte[] enc = new byte[engine.getOutputSize(content.getBytes().length)];  
            int size1 = engine.processBytes(content.getBytes(), 0, content.getBytes().length, enc, 0);  
            int size2 = engine.doFinal(enc, size1);  
            System.out.println("size2 ="+size2);  
            byte[] encryptedContent =new byte[size1+size2];  
            System.arraycopy(enc, 0, encryptedContent, 0, encryptedContent.length);  
            System.out.println("Encrypted Content:");  
            System.out.println(new String(Hex.encode(encryptedContent)));  
            
              
           engine.init(false, new ParametersWithIV(new KeyParameter(keybytes),iv));  
            byte[] dec = new byte[engine.getOutputSize(encryptedContent.length)];  
            size1 = engine.processBytes(encryptedContent, 0, encryptedContent.length, dec, 0);  
            size2 = engine.doFinal(dec, size1);  
            System.out.println("size2 ="+size2);  
            byte[] decryptedContent =new byte[size1+size2];  
            System.arraycopy(dec, 0, decryptedContent, 0, decryptedContent.length);  
            System.out.println("Decrypted Content:");  
            System.out.println(new String(decryptedContent));  
  
        } catch (Exception ex) {  
            ex.printStackTrace();  
        }  
  
   }  
  
} 